package cn.aiweiyi.qingjing.coupon.distribution.service;

import cn.aiweiyi.qingjing.coupon.comm.constant.CouponStatus;
import cn.aiweiyi.qingjing.coupon.comm.exception.CouponException;
import cn.aiweiyi.qingjing.coupon.distribution.entity.Coupon;

import java.util.List;

/**
 * 分发业务中优惠券Redis缓存相关的业务操作
 */
public interface RedisService {
    /**
     * 根据 userId 和状态找到缓存的优惠券列表数据
     *
     * @param userId 用户id
     * @param status 优惠券状态 {@link CouponStatus}
     * @return {@link Coupon}s,注意,可能会返回 null,代表从没有过记录
     */
    List<Coupon> getCachedCoupons(Long userId, Integer status);


    /**
     * 保存空的优惠券列表到缓存中,为了避免缓存穿透
     *
     * @param userId 用户id
     * @param status 优惠券状态列表
     */
    void saveEmptyCouponListToCache(Long userId, List<Integer> status);

    /**
     * 尝试从 Cache中获取一个优惠券码
     *
     * @param templateId 优惠券模板主键
     * @return 优惠券码
     */
    String tryToAcquireCouponCodeFromCache(Integer templateId);

    /**
     * 尝试从 Cache 中获取一个优惠券码
     *
     * @param userId  用户id
     * @param coupons {@link Coupon}s
     * @param status  优惠券状态
     * @return 操作成功的优惠券个数
     */
    Integer addCouponToCache(Long userId, List<Coupon> coupons,
                             Integer status) throws CouponException;
}
